package com.woniu.service.impl;

import com.woniu.mapper.BookMapper;
import com.woniu.pojo.Book;
import com.woniu.redis.RedisConst;
import com.woniu.service.BookService;
import com.woniu.service.CartService;
import com.woniu.vo.CartItemVo;
import com.woniu.vo.CartVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
@Slf4j
public class CartServiceImpl implements CartService {
    @Autowired
    private RedisTemplate<String, CartVo> redisTemplate;

    @Autowired
    private BookService bookService;
    @Autowired
    private BookMapper bookMapper;

    @Override
    public CartVo getCart(Long userId) {
        // 从 redis根据 userId 获取用户购物车信息
        ValueOperations<String,CartVo> valueOperations = redisTemplate.opsForValue();
        String key = RedisConst.USER_CART_PREFIX + ":" + userId;
        CartVo cartVo = valueOperations.get(key);

        // 如果redis中没有，创建一个新的购物车
        if (cartVo == null) {
            cartVo = new CartVo();
            // 添加用户ID到购物车
            cartVo.setUserId(userId);
        }
        // 将数据 存入redis
        redisTemplate.opsForValue().set(key, cartVo, RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);
        log.info("当前用户:{},  购物车信息如下：{}",userId,redisTemplate.opsForValue().get(key));
        return cartVo;
    }

    @Override
    public CartVo addCartItem(Long userId, Long bookId) {
        // 调用 getCart()方法，获取用户购物车信息
        CartVo cartVo = getCart(userId);

        // 查看购物车是否包含该商品,如果存在，直接更新数量，和总价
        cartVo.updateItemQuantity(bookId, 1);

        // 购物车不存在该商品，添加商品到购物车
        /**
         * 根据 bookId查询图书信息
         *  1.先从redis 查询 bookId 是否存在
         *      存在，直接添加商品
         *  2.不存在，查询数据库
         * */
        Book book = bookMapper.selectById(bookId);
        CartItemVo cartItemVo = new CartItemVo(userId, bookId, book.getName(), book.getImgSrc(), book.getPrice(), 1);
        cartVo.addItem(cartItemVo);

        // 将购物车对象在redis 存储 7天
        redisTemplate.opsForValue().set(
                RedisConst.USER_CART_PREFIX + ":" + userId,
                    cartVo,
                    RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);

        return cartVo;
    }

    @Override
    public CartVo removeCartItem(Long userId, Long bookId) {
        // 调用 getCart()方法，获取用户购物车信息
        CartVo cartVo = getCart(userId);
        // 移除 商品
        cartVo.removeItem(bookId);

        // 更新redis缓存
        redisTemplate.opsForValue().set(
                RedisConst.USER_CART_PREFIX + ":" + userId,
                cartVo,
                RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);

        return cartVo;
    }

    /**
     * 清空购物车
     * */
    @Override
    public CartVo clearCartItem(Long userId) {
        CartVo cart = getCart(userId);
        cart.clearCart();
        // 更新redis ，将value 设置为null
        redisTemplate.opsForValue().set(
                RedisConst.USER_CART_PREFIX + ":" + userId,
                null,
                RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);
        return cart;
    }

    /**
     * 修改书籍数量
     * */
    @Override
    public CartVo updateCartItem(Long userId, Long bookId, Integer quantity) {
        CartVo cart = getCart(userId);
        cart.updateItemQuantity(bookId, quantity);

        // 更新redis
        redisTemplate.opsForValue().set(
                RedisConst.USER_CART_PREFIX + ":" + userId,
                cart,
                RedisConst.USER_CART_EXPIRE, TimeUnit.DAYS);

        return cart;
    }

    /**
     * 清空购物车业务实现
     * */
    @Override
    public CartVo clearCart(Long userId) {
        CartVo cart = getCart(userId);
        cart.clearCart();
        redisTemplate.delete(RedisConst.USER_CART_PREFIX + ":" + userId);
        return cart;
    }
}
